﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace CoreCommon
{
    /// <summary>
    /// Класс содержит функции позволяющие выполнять сериализацию нужных объектов
    /// </summary>
    public sealed class CoreSerialize   
    {
        /// <summary>
        /// Сериализация объекта obj в файл fileName
        /// </summary>
        /// <param name="fileName">Имя файла, куда сериализуется объект obj</param>
        /// <param name="obj">Объект для сериализации в файл fileName</param>
        static public void Serialize(string fileName, object obj)
        {
            if (obj == null)
                return;
            BinaryFormatter f = new BinaryFormatter();
            using (Stream nf = NewFileStream(fileName))
            {
                f.Serialize(nf, obj);
            }
        }

        /// <summary>
        /// Восстановление объекта в соответствии с сохраненным состоянием из файла fileName
        /// </summary>
        /// <param name="fileName">Имя файла, откуда восстанавливается состояние объекта</param>
        /// <returns>Восстановленный объект</returns>
        /// <remarks>При использовании функции нужно знать, тип объкта для которого восстанавливается состояние. Функцию нужно использовать в блоке try catch, на случай
        /// возникновения исключительной ситуации при несовпадении типов</remarks>
        static public object Deserialize(string fileName)
        {
            BinaryFormatter f = new BinaryFormatter();
            using (Stream strm = GetFileStream(fileName))
            {
                if ((strm != null) && (strm.Length != 0))
                {
                    return f.Deserialize(strm);
                }
                else
                    return null;
            }
        }

        #region Приватные методы

        static private Stream NewFileStream(string fileName)
        {
            return File.Create(fileName);
        }
        static private Stream GetFileStream(string fileName)
        {
            if (File.Exists(fileName))
                return File.OpenRead(fileName);
            else
                return null;
        }
        private CoreSerialize() { }

        #endregion
    }
}
